/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.liquidByte.trafficMustang.server.business;

import java.math.BigDecimal;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import org.liquidByte.trafficMustang.server.dataModel.*;
import org.liquidByte.trafficMustang.server.dataModel.enums.TrechoSituacao;
import org.liquidByte.trafficMustang.server.repository.*;
import org.liquidByte.trafficMustang.server.services.Converter;
import org.liquidByte.trafficMustang.server.services.ConverterService;
import org.liquidByte.trafficMustang.server.webService.dto.*;

/**
 *
 * @author Alexandre
 */
@Stateless
public class ConverterBO implements ConverterService {
    //<editor-fold defaultstate="collapsed" desc="EJB Injection">
    @EJB
    private AvaliacaoRepository avaliacaoRepository;
    @EJB
    private DeslocamentoRepository deslocamentoRepository;
    @EJB
    private TrechoRepository trechoRepository;
    @EJB
    private UsuarioRepository usuarioRepository;
    @EJB
    private VeiculoRepository veiculoRepository;
    //</editor-fold>
    
    //<editor-fold defaultstate="collapsed" desc="Converter Impl">
    private final Converter<Avaliacao, AvaliacaoDTO> avaliacaoConverter = new Converter<Avaliacao, AvaliacaoDTO>() {
        public AvaliacaoDTO convert(Avaliacao model) {
            if (model == null) {
                return null;
            } else {
                AvaliacaoDTO dto = new AvaliacaoDTO();
                
                dto.setAvaliado(ConverterBO.this.usuarioConverter.convert(model.getUsrIdAvld()));
                dto.setDescricao(model.getAvalDsc());
                dto.setId(model.getAvalId());
                dto.setQualificacao(model.getAvalQlf());
                dto.setPendente(model.isAvalPend());
                
                return dto;
            }
        }
    };
    private final Converter<AvaliacaoDTO, Avaliacao> avaliacaoDtoConverter = new Converter<AvaliacaoDTO, Avaliacao>() {
        
        public Avaliacao convert(AvaliacaoDTO model) {
            if (model == null) {
                return null;
            }
            Avaliacao dbObj = ConverterBO.this.avaliacaoRepository.getById(model.getId());
            if (dbObj == null) {
                dbObj = new Avaliacao();
            }
            dbObj.setAvalDsc(model.getDescricao());
            dbObj.setAvalQlf(model.getQualificacao());
            dbObj.setAvalPend(model.isPendente());
            return dbObj;
        }
    };
    private final Converter<Deslocamento, DeslocamentoDTO> deslocamentoConverter = new Converter<Deslocamento, DeslocamentoDTO>() {
        
        public DeslocamentoDTO convert(Deslocamento model) {
            if (model == null) {
                return null;
            } else {
                DeslocamentoDTO dto = new DeslocamentoDTO();
                
                if (model.getMotrId() == null) {
                    dto.setMotorista(null);
                } else {
                    dto.setMotorista(ConverterBO.this.usuarioConverter.convert(model.getMotrId().getUsuario()));
                }
                dto.setVeiculo(ConverterBO.this.veiculoConverter.convert(model.getVeicId()));
                dto.setSituacao(model.getDeslcSitId().getDescription());
                dto.setId(model.getDeslcId());
                dto.setTaxa(model.getDeslcTax().doubleValue());
                
                return dto;
            }
        }
    };
    private final Converter<DeslocamentoDTO, Deslocamento> deslocamentoDtoConverter = new Converter<DeslocamentoDTO, Deslocamento>() {
        
        public Deslocamento convert(DeslocamentoDTO model) {
            if (model == null) {
                return null;
            }
            Deslocamento dbObj = ConverterBO.this.deslocamentoRepository.getById(model.getId());
            if (dbObj == null) {
                dbObj = new Deslocamento();
                if (model.getMotorista() != null) {
                    dbObj.setMotrId(ConverterBO.this.usuarioDtoConverter.convert(model.getMotorista()).getMotorista());
                }
                if (model.getVeiculo() != null) {
                    dbObj.setVeicId(ConverterBO.this.veiculoDtoConverter.convert(model.getVeiculo()));
                }
                if (model.getLocalizacao() != null) {
                    LocalizacaoDTO localDto = model.getLocalizacao();
                    dbObj.setLocalizacao(ConverterBO.this.getLocalizacaoDto().convert(localDto));
                }
            }
            dbObj.setDeslcTax(new BigDecimal(model.getTaxa()));
            return dbObj;
        }
    };
    private Converter<Trecho, TrechoDTO> trechoConverter = new Converter<Trecho, TrechoDTO>() {
        
        public TrechoDTO convert(Trecho model) {
            if (model == null) {
                return null;
            } else {
                TrechoDTO dto = new TrechoDTO();
                dto.setDesembarcavel(model.getTrecSitId() == TrechoSituacao.Embarcado);
                dto.setEmbarcavel(model.getTrecSitId() == TrechoSituacao.Confirmado);
                dto.setCancelavel(model.getTrecSitId() == TrechoSituacao.Solicitado ||
                                  model.getTrecSitId() == TrechoSituacao.Confirmado);
                dto.setPassageiroRastreavel(model.getTrecSitId() == TrechoSituacao.Solicitado ||
                                            model.getTrecSitId() == TrechoSituacao.Confirmado);
                dto.setMotoristaRastreavel(model.getTrecSitId() == TrechoSituacao.Confirmado);
                
                dto.setDeslocamento(ConverterBO.this.deslocamentoConverter.convert(model.getDeslcId()));
                dto.setId(model.getTrecId());
                if (model.getPasgId() == null) {
                    dto.setPassageiro(null);
                } else {
                    dto.setPassageiro(ConverterBO.this.usuarioConverter.convert(model.getPasgId().getUsuario()));
                }
                dto.setSituacao(model.getTrecSitId().getDescription());
                
                return dto;
            }
            
        }
    };
    private Converter<TrechoDTO, Trecho> trechoDtoConverter = new Converter<TrechoDTO, Trecho>() {
        
        public Trecho convert(TrechoDTO model) {
            if (model == null) {
                return null;
            }
            return ConverterBO.this.trechoRepository.getById(model.getId());
        }
    };
    private Converter<Usuario, UsuarioDTO> usuarioConverter = new Converter<Usuario, UsuarioDTO>() {
        
        public UsuarioDTO convert(Usuario model) {
            if (model == null) {
                return null;
            } else {
                UsuarioDTO dto = new UsuarioDTO();
                dto.setId(model.getUsrId());
                dto.setNome(model.getUsrNm());
                if (model.getUsrQlfTot() == 0) {
                    dto.setReputacao(0);
                } else {
                    dto.setReputacao(model.getUsrQlf() / model.getUsrQlfTot());
                }
                return dto;
            }
        }
    };
    private Converter<UsuarioDTO, Usuario> usuarioDtoConverter = new Converter<UsuarioDTO, Usuario>() {
        
        public Usuario convert(UsuarioDTO model) {
            if (model == null) {
                return null;
            }
            return ConverterBO.this.usuarioRepository.getById(model.getId());
        }
    };
    private Converter<Veiculo, VeiculoDTO> veiculoConverter = new Converter<Veiculo, VeiculoDTO>() {
        
        public VeiculoDTO convert(Veiculo model) {
            if (model == null) {
                return null;
            } else {
                VeiculoDTO dto = new VeiculoDTO();
                dto.setCor(model.getVeicCor());
                dto.setDescricao(model.getVeicDesc());
                dto.setId(model.getVeicId());
                dto.setLotacao(model.getVeicLotc());
                dto.setMarca(model.getVeicMarc());
                dto.setModelo(model.getVeicModl());
                dto.setPlaca(model.getVeicPlac());
                return dto;
            }
        }
    };
    private Converter<VeiculoDTO, Veiculo> veiculoDtoConverter = new Converter<VeiculoDTO, Veiculo>() {
        
        public Veiculo convert(VeiculoDTO model) {
            if (model == null) {
                return null;
            }
            Veiculo dbObj = ConverterBO.this.veiculoRepository.getById(model.getId());
            if (dbObj == null) {
                dbObj = new Veiculo();
            }
            dbObj.setVeicCor(model.getCor());
            dbObj.setVeicDesc(model.getDescricao());
            dbObj.setVeicLotc(model.getLotacao());
            dbObj.setVeicMarc(model.getMarca());
            dbObj.setVeicModl(model.getModelo());
            dbObj.setVeicPlac(model.getPlaca());
            return dbObj;
        }
    };
    private Converter<Localizacao, LocalizacaoDTO> localizacaoConverter = new  Converter<Localizacao, LocalizacaoDTO>() {

        @Override
        public LocalizacaoDTO convert(Localizacao input) {
            if (input == null) {
                return null;
            }
            return new LocalizacaoDTO(input.getLongitude().doubleValue(), input.getLatitude().doubleValue());
        }
    };
    private Converter<LocalizacaoDTO, Localizacao> localizacaoDtoConverter = new Converter<LocalizacaoDTO, Localizacao>() {

        @Override
        public Localizacao convert(LocalizacaoDTO input) {
            if (input == null) {
                return null;
            }
            return new Localizacao(new BigDecimal(input.getLongitude()), new BigDecimal(input.getLatitude()));
        }
    };
    //</editor-fold>

    //<editor-fold defaultstate="collapsed" desc="ConverterService Method Impl">
    public Converter<Avaliacao, AvaliacaoDTO> getAvaliacao() {
        return this.avaliacaoConverter;
    }
    public Converter<AvaliacaoDTO, Avaliacao> getAvaliacaoDto() {
        return this.avaliacaoDtoConverter;
    }
    public Converter<Deslocamento, DeslocamentoDTO> getDeslocamento() {
        return this.deslocamentoConverter;
    }
    public Converter<DeslocamentoDTO, Deslocamento> getDeslocamentoDto() {
        return this.deslocamentoDtoConverter;
    }
    public Converter<Trecho, TrechoDTO> getTrecho() {
        return this.trechoConverter;
    }
    public Converter<TrechoDTO, Trecho> getTrechoDto() {
        return this.trechoDtoConverter;
    }
    public Converter<Usuario, UsuarioDTO> getUsuario() {
        return this.usuarioConverter;
    }
    public Converter<UsuarioDTO, Usuario> getUsuarioDto() {
        return this.usuarioDtoConverter;
    }
    public Converter<Veiculo, VeiculoDTO> getVeiculo() {
        return this.veiculoConverter;
    }
    public Converter<VeiculoDTO, Veiculo> getVeiculoDto() {
        return this.veiculoDtoConverter;
    }
    public Converter<Localizacao, LocalizacaoDTO> getLocalizacao() {
        return this.localizacaoConverter;
    }
    public Converter<LocalizacaoDTO, Localizacao> getLocalizacaoDto() {
        return this.localizacaoDtoConverter;
    }
    //</editor-fold>
}
